package com.cloud.wms.ui.main.presnter;

import android.Manifest;
import android.text.TextUtils;

import com.annimon.stream.Stream;
import com.annimon.stream.function.Predicate;
import com.cloud.core.base.BaseRxPresenter;
import com.cloud.core.http.BaseObserver;
import com.cloud.core.http.error.ApiException;
import com.cloud.core.utils.JsonUtils;
import com.cloud.core.utils.MessageCreator;
import com.cloud.core.widget.dialog.LoadingDialog;
import com.cloud.wms.app.FineExApplication;
import com.cloud.wms.config.HttpConfig;
import com.cloud.wms.entity.UpdateInfoBean;
import com.cloud.wms.http.Params;
import com.cloud.wms.http.download.DownloadSuccessBean;
import com.cloud.wms.http.observer.LoadingObserver;
import com.cloud.wms.http.observer.ResponseWrapper;
import com.cloud.wms.http.url.SiteManager;
import com.cloud.wms.tools.RxUtils;
import com.cloud.wms.ui.main.contract.LoginContract;
import com.cloud.wms.ui.main.entity.ModelEntity;
import com.cloud.wms.ui.main.entity.RemoteLoginEntity;
import com.tbruyelle.rxpermissions2.RxPermissions;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import io.reactivex.Observable;
import io.reactivex.ObservableSource;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.functions.Function;

/**
 * @Author:Chen
 * @Date: 2021-01-14 15:51
 * @Description:
 */
public class LoginPresenter extends BaseRxPresenter<LoginContract.View> implements LoginContract.Presenter {
    /**
     * 权限组
     */
    private static final String[] permissionsGroup = new String[]{
            Manifest.permission.ACCESS_NETWORK_STATE,
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.READ_PHONE_STATE,
            Manifest.permission.ACCESS_WIFI_STATE,
            Manifest.permission.CAMERA,
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_FINE_LOCATION};


    @Inject
    public LoginPresenter() {

    }

    @Override
    public void checkPermission(RxPermissions rxPermissions) {
        if (!rxPermissions.isGranted(Manifest.permission.ACCESS_NETWORK_STATE)
                || !rxPermissions.isGranted(Manifest.permission.READ_EXTERNAL_STORAGE)
                || !rxPermissions.isGranted(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                || !rxPermissions.isGranted(Manifest.permission.READ_PHONE_STATE)
                || !rxPermissions.isGranted(Manifest.permission.ACCESS_WIFI_STATE)
                || !rxPermissions.isGranted(Manifest.permission.CAMERA)
                || !rxPermissions.isGranted(Manifest.permission.ACCESS_COARSE_LOCATION)
                || !rxPermissions.isGranted(Manifest.permission.ACCESS_FINE_LOCATION)) {
            mView.showPermissionDialog();
        } else {
            mView.setPermissionState(true);
        }
    }

    @Override
    public void getPermission(RxPermissions rxPermissions) {
        rxPermissions.request(permissionsGroup)
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new BaseObserver<Boolean>() {
                    @Override
                    public void onSuccess(Boolean granted) {
                        mView.setPermissionState(granted);
                        if (!granted) {
                            mView.error("获取权限失败，请打开重试或手机设置功能自行开启");
                        }
                    }

                    @Override
                    public void onError(String msg) {
                        mView.error(msg);
                    }
                });
    }

    /**
     * 最近登录的五个账号
     *
     * @return
     */
    @Override
    public ArrayList<String> loadAccountRecord() {
        String accountJson = FineExApplication.component().kv().decodeString("ACCOUNT_RECORDS", "[]");
        return JsonUtils.jsonToArrayList(accountJson);
    }

    @Override
    public void loginServer(String account, String pwd) {
        if (TextUtils.isEmpty(account) || TextUtils.isEmpty(pwd)) {
            mView.error("工号或密码不能为空");
        }
        Params params = new Params();
        params.put("LoginNo", account);
        params.put("Password", pwd);

        FineExApplication
                .component()
                .http()
                .login(params)
                .map(new ResponseWrapper<>())
//                .map(remoteLoginEntity -> {
//
//                    remoteLoginEntity.getUserInfo().setJobStationID(1);
//                    remoteLoginEntity.getUserInfo().setProductCategory(1);
//
//                    ArrayList<ModelEntity> modelEntities = new ArrayList<>();
//                    ModelEntity entity = new ModelEntity();
//                    entity.setModuleID(1601);
//                    entity.setModuleCode("1601");
//                    entity.setModuleName("入库");
//                    entity.setParentModuleId(0);
//                    entity.setUrl("");
//                    entity.setChildModel(null);
//                    modelEntities.add(entity);
//
//                    ModelEntity entity1 = new ModelEntity();
//                    entity1.setModuleID(1602);
//                    entity1.setModuleCode("1601");
//                    entity1.setModuleName("到货登记");
//                    entity1.setParentModuleId(1601);
//                    entity1.setTaskCode("001001");
//                    entity1.setUrl("in.register.InOrderActivity");
//                    entity1.setChildModel(null);
//                    modelEntities.add(entity1);
//
//                    ModelEntity entity2 = new ModelEntity();
//                    entity2.setModuleID(1603);
//                    entity2.setModuleCode("1601");
//                    entity2.setModuleName("入库清点");
//                    entity2.setParentModuleId(1601);
//                    entity2.setTaskCode("001002");
//                    entity2.setUrl("in.inventory.InOrderActivity");
//                    entity2.setChildModel(null);
//                    modelEntities.add(entity2);
//
//                    ModelEntity entity4 = new ModelEntity();
//                    entity4.setModuleID(1605);
//                    entity4.setModuleCode("1601");
//                    entity4.setModuleName("商品上架");
//                    entity4.setParentModuleId(1601);
//                    entity4.setTaskCode("001003");
//                    entity4.setUrl("in.shelf.InOrderActivity");
//                    entity4.setChildModel(null);
//                    modelEntities.add(entity4);
//
//                    ModelEntity entity5 = new ModelEntity();
//                    entity5.setModuleID(1701);
//                    entity5.setModuleCode("1701");
//                    entity5.setModuleName("库内");
//                    entity5.setParentModuleId(0);
//                    entity5.setUrl("");
//                    entity5.setChildModel(null);
//                    modelEntities.add(entity5);
//
//                    ModelEntity entity6 = new ModelEntity();
//                    entity6.setModuleID(1702);
//                    entity6.setModuleCode("1701");
//                    entity6.setModuleName("箱唛打印");
//                    entity6.setParentModuleId(1701);
//                    entity6.setUrl("print.activity.SelectBoxActivity");
//                    entity6.setChildModel(null);
//                    modelEntities.add(entity6);
//
//                    ModelEntity entity8 = new ModelEntity();
//                    entity8.setModuleID(1704);
//                    entity8.setModuleCode("1701");
//                    entity8.setModuleName("容器释放");
//                    entity8.setParentModuleId(1701);
//                    entity8.setUrl("inside.container.ReleaseActivity");
//                    entity8.setChildModel(null);
//                    modelEntities.add(entity8);
//
//                    ModelEntity entity59 = new ModelEntity();
//                    entity59.setModuleID(1705);
//                    entity59.setModuleCode("1705");
//                    entity59.setModuleName("补货申请");
//                    entity59.setParentModuleId(1701);
//                    entity59.setUrl("inside.replenish.ApplyStartActivity");
//                    entity59.setChildModel(null);
//                    modelEntities.add(entity59);
//
//                    ModelEntity entity50 = new ModelEntity();
//                    entity50.setModuleID(1706);
//                    entity50.setModuleCode("1706");
//                    entity50.setModuleName("还货");
//                    entity50.setParentModuleId(1701);
//                    entity50.setUrl("inside.revert.RevertCommodityActivity");
//                    entity50.setChildModel(null);
//                    modelEntities.add(entity50);
//
//                    ModelEntity entity10 = new ModelEntity();
//                    entity10.setModuleID(1800);
//                    entity10.setModuleCode("1800");
//                    entity10.setModuleName("团购生产");
//                    entity10.setParentModuleId(0);
//                    entity10.setUrl("");
//                    entity10.setChildModel(null);
//                    modelEntities.add(entity10);
//
//                    ModelEntity entity9 = new ModelEntity();
//                    entity9.setModuleID(1801);
//                    entity9.setModuleCode("1801");
//                    entity9.setModuleName("团购备货");
//                    entity9.setParentModuleId(1800);
//                    entity9.setTaskCode("002002");
//                    entity9.setUrl("sort.group.GroupBatchActivity");
//                    entity9.setChildModel(null);
//                    modelEntities.add(entity9);
//
//                    ModelEntity entity13 = new ModelEntity();
//                    entity13.setModuleID(1802);
//                    entity13.setModuleCode("1802");
//                    entity13.setModuleName("团购集货");
//                    entity13.setParentModuleId(1800);
//                    entity13.setTaskCode("002003");
//                    entity13.setUrl("group.collect.GroupBatchActivity");
//                    entity13.setChildModel(null);
//                    modelEntities.add(entity13);
//
//                    ModelEntity entity11 = new ModelEntity();
//                    entity11.setModuleID(1803);
//                    entity11.setModuleCode("1803");
//                    entity11.setModuleName("团购领用");
//                    entity11.setParentModuleId(1800);
//                    entity11.setTaskCode("002004");
//                    entity11.setUrl("group.obtain.GroupBatchActivity");
//                    entity11.setChildModel(null);
//                    modelEntities.add(entity11);
//
//                    ModelEntity entity12 = new ModelEntity();
//                    entity12.setModuleID(1804);
//                    entity12.setModuleCode("1804");
//                    entity12.setModuleName("团购抽检");
//                    entity12.setParentModuleId(1800);
//                    entity12.setTaskCode("002005");
//                    entity12.setUrl("group.sampling.GroupBatchActivity");
//                    entity12.setChildModel(null);
//                    modelEntities.add(entity12);
//
//                    ModelEntity entity30 = new ModelEntity();
//                    entity30.setModuleID(3000);
//                    entity30.setModuleCode("3000");
//                    entity30.setModuleName("拣选");
//                    entity30.setParentModuleId(0);
//                    entity30.setUrl("");
//                    entity30.setChildModel(null);
//                    modelEntities.add(entity30);
//
//                    ModelEntity entity32 = new ModelEntity();
//                    entity32.setModuleID(3002);
//                    entity32.setModuleCode("3002");
//                    entity32.setModuleName("笼车分拣");
//                    entity32.setParentModuleId(3000);
//                    entity32.setTaskCode("003001");
//                    entity32.setUrl("sort.car.CarBatchActivity");
//                    entity32.setChildModel(null);
//                    modelEntities.add(entity32);
//
//                    ModelEntity entity33 = new ModelEntity();
//                    entity33.setModuleID(3003);
//                    entity33.setModuleCode("3003");
//                    entity33.setModuleName("订单拣选");
//                    entity33.setTaskCode("003001");
//                    entity33.setParentModuleId(3000);
//                    entity33.setUrl("sort.order.OrderBatchActivity");
//                    entity33.setChildModel(null);
//                    modelEntities.add(entity33);
//
//                    ModelEntity entity34 = new ModelEntity();
//                    entity34.setModuleID(3004);
//                    entity34.setModuleCode("3004");
//                    entity34.setModuleName("单SKU拣选");
//                    entity34.setParentModuleId(3000);
//                    entity34.setTaskCode("003001");
//                    entity34.setUrl("sort.sku.SkuBatchActivity");
//                    entity34.setChildModel(null);
//                    modelEntities.add(entity34);
//
//                    ModelEntity entity35 = new ModelEntity();
//                    entity35.setModuleID(3004);
//                    entity35.setModuleCode("3004");
//                    entity35.setModuleName("二次分拨");
//                    entity35.setParentModuleId(3000);
//                    entity35.setUrl("sort.detach.DetachStartActivity");
//                    entity35.setChildModel(null);
//                    modelEntities.add(entity35);
//
//                    ModelEntity entity22 = new ModelEntity();
//                    entity22.setModuleID(1900);
//                    entity22.setModuleCode("1900");
//                    entity22.setModuleName("数据");
//                    entity22.setParentModuleId(0);
//                    entity22.setUrl("");
//                    entity22.setChildModel(null);
//                    modelEntities.add(entity22);
//
//                    ModelEntity entity23 = new ModelEntity();
//                    entity23.setModuleID(1902);
//                    entity23.setModuleCode("1902");
//                    entity23.setModuleName("库存查询");
//                    entity23.setParentModuleId(1900);
//                    entity23.setUrl("data.activity.CheckInventoryActivity");
//                    entity23.setChildModel(null);
//                    modelEntities.add(entity23);
//
//                    ModelEntity entity91 = new ModelEntity();
//                    entity91.setModuleID(1901);
//                    entity91.setModuleCode("1901");
//                    entity91.setModuleName("拍照上传");
//                    entity91.setParentModuleId(1900);
//                    entity91.setUrl("data.activity.UploadImgActivity");
//                    entity91.setChildModel(null);
//                    modelEntities.add(entity91);
//
//                    remoteLoginEntity.setModuleList(modelEntities);
//                    return remoteLoginEntity;
//                })
                .flatMap((Function<RemoteLoginEntity, ObservableSource<RemoteLoginEntity>>) remoteLoginEntity -> {
                    if (remoteLoginEntity.getModuleList() == null || remoteLoginEntity.getModuleList().isEmpty()) {
                        return Observable.error(new ApiException("当前登录人无PDA模块权限，请检查！"));
                    }
                    return Observable.just(remoteLoginEntity);
                })
                .map(entity -> {
                    //todo 待后台返回
                    entity.getUserInfo().setJobStationID(1);
                    entity.getUserInfo().setProductCategory(1);

                    ArrayList<String> list = loadAccountRecord();
                    if (list.size() >= 5) {
                        list.remove(list.get(list.size() - 1));
                    }
                    int index = -1;
                    for (int i = 0; i < list.size(); i++) {
                        if (account.equalsIgnoreCase(list.get(i))) {
                            index = i;
                            break;
                        }
                    }
                    if (index >= 0) list.remove(index);
                    list.add(0, account);
                    FineExApplication.component().kv().encode("ACCOUNT_RECORDS", JsonUtils.list2json(list));
                    //移除一级菜单,并排序
                    List<ModelEntity> modelEntityList = Stream.ofNullable(entity.getModuleList())
                            .filter(value -> value.getParentModuleId() != -1)
                            .sortBy(ModelEntity::getSortNum).toList();
                    //假如有多个一级菜单(多个系统)，全部取出,存储，之后用户选择使用系统版本
                    List<ModelEntity> parentModelEntityList = Stream.ofNullable(entity.getModuleList())
                            .filter(value -> value.getParentModuleId() == -1).toList();
                    FineExApplication.component().loginCache().setParentModelList(parentModelEntityList);
                    for (int i = 0; i < modelEntityList.size(); i++) {
                        ModelEntity modelEntity = modelEntityList.get(i);
                        ArrayList<ModelEntity> beans = new ArrayList<>();
                        for (int j = 0; j < modelEntityList.size(); j++) {
                            ModelEntity entity1 = modelEntityList.get(j);
                            if (entity1.getParentModuleId() != 0
                                    && modelEntity.getModuleID() == entity1.getParentModuleId()) {
                                beans.add(entity1);
                            }
                        }
                        modelEntity.setChildModel(beans);
                    }
                    ArrayList<ModelEntity> entities = new ArrayList<>();
                    for (int i = 0; i < modelEntityList.size(); i++) {
                        ModelEntity modelEntity = modelEntityList.get(i);
                        if (modelEntity != null
                                && modelEntity.getChildModel() != null
                                && !modelEntity.getChildModel().isEmpty())
                            entities.add(modelEntity);
                    }
                    entity.setModuleList(entities);
                    return entity;
                })
                .map(entity -> {
                    FineExApplication.component().loginCache().setToken(entity.getAccessToken());
                    FineExApplication.component().loginCache().setUserInfo(entity.getUserInfo());
                    FineExApplication.component().loginCache().setModelList(entity.getModuleList());
                    return entity;
                })
                .compose(mView.toLifecycle())
                .compose(RxUtils.threadSwitch())
                .subscribe(new LoadingObserver<RemoteLoginEntity>(mView.provideContext()) {
                    @Override
                    public void onSuccess(RemoteLoginEntity info) {
                        mView.jumpToBase(info);
                    }

                    @Override
                    public void onError(String msg) {
                        mView.error(msg);
                    }
                });
    }

    @Override
    public void downloadApk(String downloadUrl, String realPath) {
        FineExApplication.component().http().downloadApk(downloadUrl, HttpConfig.HTTP_HEADER_DOWNLOAD_APK_KEY)
                .map(responseBody -> {
                    try {
                        BufferedInputStream bis = new BufferedInputStream(responseBody.byteStream());
                        File file = new File(realPath);
                        FileOutputStream fos = new FileOutputStream(file);
                        byte[] buffer = new byte[1024];
                        int len;
                        while ((len = bis.read(buffer)) != -1) {
                            fos.write(buffer, 0, len);
                            fos.flush();
                        }
                        fos.close();
                        bis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    DownloadSuccessBean downloadRespBean = new DownloadSuccessBean();
                    downloadRespBean.localPath = realPath;
                    downloadRespBean.identifier = realPath;
                    return downloadRespBean;
                })
                .compose(mView.toLifecycle())
                .compose(RxUtils.threadSwitch())
                .subscribe(new BaseObserver<DownloadSuccessBean>() {
                    @Override
                    public void onSuccess(DownloadSuccessBean info) {
                        mView.downLoadSuccess(info.localPath);
                    }

                    @Override
                    public void onError(String msg) {

                    }

                    @Override
                    public void onError(Throwable throwable) {
                        super.onError(throwable);
                        mView.downLoadFailure(throwable);
                    }
                });
    }

    @Override
    public void getVersion() {
        FineExApplication
                .component()
                .http()
                .getVersion(SiteManager.UPDATE_VERSION_URL, SiteManager.UPDATE_SYS)
                .compose(mView.toLifecycle())
                .compose(RxUtils.threadSwitch())
                .subscribe(new LoadingObserver<UpdateInfoBean>(mView.provideContext()) {
                    @Override
                    public void onSuccess(UpdateInfoBean updateInfoBean) {
                        if (updateInfoBean.isSource()) {
                            mView.showUpdateDialog(updateInfoBean.getVer());
                        } else {
                            mView.error(updateInfoBean.getMessage());
                        }
                    }

                    @Override
                    public void onError(String msg) {
                        mView.error("更新服务器异常！");
                    }
                });
    }
}
